﻿using System;
using System.Collections.Generic;
using System.Linq;

using Microsoft.Xna.Framework;
using Microsoft.Xna.Framework.Audio;
using Microsoft.Xna.Framework.Content;
using Microsoft.Xna.Framework.GamerServices;
using Microsoft.Xna.Framework.Graphics;
using Microsoft.Xna.Framework.Input;
using Microsoft.Xna.Framework.Input.Touch;
using Microsoft.Xna.Framework.Media;
namespace MemoryGame
{


public class Map
{
    public static int BEGIN_X = 50;
    public static int BEGIN_Y = 100;
    //easy mode
    public static int GAME_EASY_COL = 4;
    public static int GAME_EASY_ROW = 4;
    //normal
    public static int GAME_NORMAL_COL = 4;
    public static int GAME_NORMAL_ROW = 5;
    //hard
    public static int GAME_HARD_COL = 5;
    public static int GAME_HARD_ROW = 5;
    //extreme
    public static int GAME_EXTREME_COL = 5;
    public static int GAME_EXTREME_ROW = 6;

    public const int GAME_MODE_EASY = 0;
    public const int GAME_MODE_NORMAL = 1;
    public const int GAME_MODE_HARD = 2;
    public const int GAME_MODE_EXTREME = 3;
    public static int gameDifficultMode = 0;
	
	public static Random random = new Random();

	//	public static int countSelectOneFrame = 0;
	//	public static FruitObject comboEffect;

    public static int CardNo = 12;           //số lượng các quân bài là 12 => có 24 lá bài
    public static int GameWidth = 4;
    public static int GameHeight = 4;        //Các lá bài được sắp thành ma trận 4x6 
    public static int CardSizeW = 130;
    public static int CardSizeH = 130;         //kích thước của các lá bài là 86x64 pixel
    public static int CardSpacing = 0;      //khoảng cách giữa hai lá bài là 16 pixel

    //mảng chuỗi lưu tên file hình của các quân bài (12 hình).      
    string[] ImagePaths = { "Image1.png", "Image2.png", "Image3.png",
                                "Image4.png", "Image5.png", "Image6.png",
                                "Image7.png", "Image8.png", "Image9.png",
                                "Image10.png", "Image11.png", "Image12.png" };

    public static Texture2D[] CardImages = new Texture2D[16];     //mảng các hình quân bài được đọc từ các file image 
    //(dùng đối tượng Bitmap của C#)
    public static Texture2D CardBack;         //hình phía sau lưng các quân bài.

    public static int[,] CardMatrix;   //mảng 2 chiều (4x6) lưu giá trị các lá bài trong ma trận  
    //CardMatrix[0,0]=0: tại vị trí [0,0] là lá bài thứ 0
    public static bool[,] CardOpened;      //mảng 2 chiều (4x6) cho biết tình trạng sấp hay ngửa
    // của các lá bài trong ma trận, true: ngửa

    public static int OpenedCount;          //Số lá bài đã được mở  

    public static bool FirstCardOpened;        //Mỗi lần mở 2 lá bài, nếu biến này bằng true,
    // nghĩa là lá bài thứ nhất đã mở
    public static int FirstCardX, FirstCardY;   //Vị trí của lá bài thứ nhất đã mở trong ma trận

	public static void Init(int width,int height)
	{
        GameWidth = width;
        GameHeight = height;
        // tạo và nạp 12 hình
        CardNo = GameHeight * GameWidth / 2;
        for (int id = 0; id < 16; id++)
        {
            if (CardImages[id] == null)
                CardImages[id] = Game1.contentManager.Load<Texture2D>("image//card//card" + id);
        }
        CardSizeW = (int)(CardImages[0].Width * Game1.SCALE_X);
        CardSizeH = (int)(CardImages[0].Height * Game1.SCALE_Y);
        //tạo và nạp hình sau lưng
        CardBack = Game1.contentManager.Load<Texture2D>("image//card//cardselect");
        CardMatrix = new int[GameHeight, GameWidth];         //tạo ma trận các lá bài
        CardOpened = new bool[GameHeight, GameWidth];       //tạo ma trận sấp ngửa

        int i, j, k;

        //Mảng này cho biết mỗi quân bài xuất hiện mấy lần (lá bài)
        int[] CardCount = new int[CardNo];
        for (k = 0; k < CardNo; k++)
            CardCount[k] = 2;               //Thiết lập có 2 lá bài cho mỗi quân bài

        Random rnd = new Random();      //tạo đối tượng sinh số ngẫu nhiên

        //duyệt qua từng ô trong ma trận, chọn ngẫu nhiên lá bài cho ô đó
        for (i = 0; i < GameHeight; i++)
            for (j = 0; j < GameWidth; j++)
            {
                do
                {
                    k = rnd.Next(0, CardNo);
                } while (CardCount[k] == 0);    // Nếu CardCount[k] == 0 nghĩa là 
                //quân bài thứ k đã sử dụng hết 
                //các lá bài, cần tìm k khác.
                CardMatrix[i, j] = k;       //lá bài tại ô i, j là quân bài thứ k
                CardCount[k]--;            //quân bài thứ k đã dùng 1 lá bài
                CardOpened[i, j] = false;     //đầu tiên, lá bài là sấp
            }
        OpenedCount = 0;              //chưa có lá bài nào mở
        FirstCardOpened = false;      //Mỗi lần mở 2 lá bài, đánh dấu lá bài thứ nhất chưa mở
	}

	public static void DrawGame(SpriteBatch c)
	{      

        //duyệt qua từng ô của ma trận để vẽ lá bài tại ô đó
        for (int i = 0; i < GameHeight; i++)
            for (int j = 0; j < GameWidth; j++)
            {
                Rectangle r = new Rectangle();   //tạo hình chữ nhật ứng với ô của ma trận
                r.X = BEGIN_X + (CardSizeW + CardSpacing) * j;
                r.Y = BEGIN_Y + (CardSizeH + CardSpacing) * i;  //tính vị trí X, Y của hình chữ nhật
                r.Width = CardSizeW;
                r.Height = CardSizeH;           //tính chiều rộng và cao của hình chữ nhật

                Texture2D bm;
                if (CardOpened[i, j])            //Nếu lá bài mở, 
                    bm = CardImages[CardMatrix[i, j]];  // chọn hình quân bài tương ứng
                else
                    bm = CardBack;                      //Nếu lá bài sấp, chọn hình lưng

                c.Draw(bm, new Vector2(r.X, r.Y), null, Color.White, 0f, new Vector2(0, 0), new Vector2(Game1.SCALE_X, Game1.SCALE_Y), SpriteEffects.None, 1);
                //g.DrawImage(bm, r.X, r.Y);              //Vẽ hình lá bài ra pnGame
                //g.DrawRectangle(Pens.Gray, r);          //Vẽ đường viền xung quanh lá bài
            }
		
	}
    public static void cardClick(int pointerX, int pointY)
    {
         int x = (pointerX - BEGIN_X) / (CardSizeW + CardSpacing);     //Tính chỉ số hàng và cột của lá bài được click
         int y = (pointY - BEGIN_Y) / (CardSizeH + CardSpacing);
         
        if (x >= GameWidth || y >= GameHeight)
             return;
                                   //Xử lý nhấn chuột
        if (!CardOpened[y, x])                  //Nếu lá bài chưa mở
        {
            CardOpened[y, x] = true;            //Mở lá bài 
                                        //Vẽ là tình trạng các lá bài
            if (!FirstCardOpened)               //Trong một lần mở 2 lá bài
            {                                   //nếu lá bài đầu tiên chưa mở
                FirstCardOpened = true;         //Đánh dấu là đã mở  
                FirstCardX = x;                 //Lưu lại vị trí mở
                FirstCardY = y;
            }
            else                                //nếu lá bài đầu tiên đã mở  
            {
                //nếu lá bài thứ 2 giống lá bài đầu tiên 
                if (CardMatrix[y, x] == CardMatrix[FirstCardY, FirstCardX])
                {
                    OpenedCount += 2;           //đánh dấu đã mở 2 lá bài

                    //Nếu đã mở hết tất cả các lá bài, chúc mừng và khởi tạo game mới
                    if (OpenedCount == GameWidth * GameHeight)
                    {
                        StateWinLose.isWin = true;
                        Game1.changeState(Game1.STATE_WINLOSE);
                    }
                }
                else    //nếu lá bài thứ 2 khác lá bài đầu tiên 
                {
                   // System.Threading.Thread.Sleep(1000);         // tạm dừng 1 giây

                    // sấp cả hai lá bài lại
                    CardOpened[y, x] = CardOpened[FirstCardY, FirstCardX] = false;
                 
                }
                FirstCardOpened = false;          //Bắt đầu lần mở 2 lá bài khác
            }
        }
    }
	public static void Update()
	{
        if(InputState.arraytouchState[0] == TouchLocationState.Released)
        {
            cardClick(InputState.arraytouchPosX[0], InputState.arraytouchPosY[0]);
        }
		
	}

	


}
}